home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-02-11 | 1.5 KB | 65 lines | [TEXT/KAHL] |
- caddr_t mmap(caddr_t caddr, size_t size, int prot, int flags, int fd, off_t pos)
- {
- long level2;
- long laddr = (long)caddr;
- /*
- * Make sure one of the sharing types is specified
- */
- int mtype = MAP_FILE; /* flags & MAP_TYPE; */
- errno = EINVAL;
- switch (mtype) {
- case MAP_FILE:
- if ((fd<0)||(fd>OPEN_MAX)||!crp->fd_tab[fd]) return((caddr_t)-1);
- if (lseek(crp->fd_tab[fd], pos, SEEK_SET) < 0)
- return((caddr_t)-1);
- kprintf("File ");
- break;
- case MAP_ANON:
- kprintf("Anon ");
- break;
- default:
- return((caddr_t)-1);
- }
- kprintf("mmap(%8X,%8X,%8X,%8X,%8X,%8X);\n", laddr, size, prot, flags, fd, pos);
- /*
- * Address (if FIXED) must be page aligned.
- * Size is implicitly rounded to a page boundary.
- */
- if ((flags & MAP_FIXED) && (laddr & (page_size-1)) || size < 0)
- {
- return((caddr_t)-1);
- }
-
- if (laddr == 0 && (flags & MAP_FIXED) == 0)
- {
- laddr = stack_limit>>2;
- }
-
- for (level2 = laddr/(1<<18); level2 < 128; level2++)
- {
- long addr;
- for (addr = (laddr&((1<<18)-1))/page_size; addr < (1<<18)/page_size; addr++)
- {
- if (!crp->level3[level2][addr])
- {
- long page = page_alloc();
- if (page) crp->level3[level2][addr] = 0x39 + page;
- else return ((caddr_t)-1);
- }
- if (mtype == MAP_FILE)
- {
- char *kbuf = (char *)(crp->level3[level2][addr]&~(page_size-1));
- long actual = read(crp->fd_tab[fd], kbuf, page_size);
- // if (actual < 0) return((caddr_t)-1);
- }
- size -= page_size;
- if (((long)size) < 0)
- {
- return ((caddr_t)laddr);
- }
- }
- }
- return((caddr_t)-1);
- }
-
-